package pers.wk.queues.dlx;

import com.rabbitmq.client.*;
import lombok.extern.slf4j.Slf4j;
import pers.wk.config.MQConfig;
import pers.wk.utils.MQConnectionUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 测试死信队列-生产者
 * 过期时间TTL
 * 过期时间TTL表示可以对消息设置预期的时间，在这个时间内都可以被消费者接收获取；
 * 过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。
 * 第一种方法是通过队列属性设置，队列中所有消息都有相同的过期时间。
 * 第二种方法是对消息进行单独设置，每条消息TTL可以不同。
 * 如果上述两种方法同时使用，则消息的过期时间以两者之间TTL较小的那个数值为准。
 * 消息在队列的生存时间一旦超过设置的TTL值，就称为dead message被投递到死信队列， 消费者将无法再收到该消息。
 */
@Slf4j
public class MessageTTLProducer {

    public static void main(String[] args) {
        //1.ConnectionFactory
        ConnectionFactory connectionFactory = MQConnectionUtils.getConnectionFactory("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //2.创建连接
            connection = connectionFactory.newConnection();
            //3.通过连接获取通道Channel
            channel = connection.createChannel();
            channel.exchangeDeclare(MQConfig.ExchangeName.DIRECT_EXCHANGE, MQConfig.ExchangeType.direct);

            Map<String, Object> argsMap = new HashMap<>();
            argsMap.put("x-dead-letter-exchange", MQConfig.ExchangeName.DLX_EXCHANGE);
            argsMap.put("x-dead-letter-routing-key", "error");
            //durable为true 队列Features 会显示"D"
            channel.queueDeclare(MQConfig.QueueNames.EMAIL_QUEUE,
                    true, false, false, argsMap);
            //队列绑定交换机
            String routingKey = "email.info";
            channel.queueBind(MQConfig.QueueNames.EMAIL_QUEUE, MQConfig.ExchangeName.DIRECT_EXCHANGE, routingKey);

            //5.死信队列 死信交换机
            channel.exchangeDeclare(MQConfig.ExchangeName.DLX_EXCHANGE, MQConfig.ExchangeType.direct);
            channel.queueDeclare(MQConfig.QueueNames.DLX_QUEUE, false, false, false, null);
            //队列绑定交换机
            channel.queueBind(MQConfig.QueueNames.DLX_QUEUE, MQConfig.ExchangeName.DLX_EXCHANGE, "error");

            System.out.println("测试死信队列-生产者启动。。。");


            Map<String, Object> headers = new HashMap<>();
            headers.put("x", "1");
            headers.put("y", "1");
            AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder()
                    .deliveryMode(2) // 传送方式  设置消息是否持久化，1： 非持久化 2：持久化
                    .priority(1)
                    .contentEncoding("UTF-8") // 编码方式
                    .expiration("10000") // 过期时间
                    .headers(headers).build(); //自定义属性

            for (int i = 0; i < 2; i++) {
                String message = "hello rabbitmq " + i;
                //AMQP.BasicProperties MessageProperties.PERSISTENT_TEXT_PLAIN;
                channel.basicPublish(MQConfig.ExchangeName.DIRECT_EXCHANGE, routingKey, basicProperties, message.getBytes());
                log.info("send message, routingKey: {}, message: {}", routingKey, message);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MQConnectionUtils.close(connection, channel);
        }
    }
}
